home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 (Walnut Creek) / Aminet - June 1993 [Walnut Creek].iso / aminet / mus / play / multiplsr.lha / fc14play.asm < prev    next >
Assembly Source File  |  1992-09-14  |  14KB  |  742 lines

  1. * MultiPlayer
  2. * Copyright (C) 1992 Bryan Ford
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License as published by
  6. * the Free Software Foundation; either version 2 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17. *
  18. * I (the author of MultiPlayer) can be contacted on the Internet at
  19. * "bryan.ford@m.cc.utah.edu".  See "Player.doc" for other addresses.
  20. *
  21. * Note:  This playroutine was not originally written by me.  In general
  22. * these playroutines are public domain, so I am bringing the versions
  23. * modified for MultiPlayer under the General Public License.  In the
  24. * few cases of already-copyrighted playroutines, the above copyright
  25. * notice applies only to the parts of the file written by me.
  26. *
  27. * $Id: fc14play.asm,v 4.1 92/06/21 11:14:02 BAF Exp Locker: BAF $
  28. *
  29.  
  30.     include "player.i"
  31.  
  32.     code    text
  33.  
  34.     xref    modmem,dmawait
  35.  
  36.     xdef    fc14start
  37.  
  38. fc14start:
  39.     plstartret 9$
  40.  
  41. 2$    movem.l    d2-d7/a2-a6,-(sp)
  42.     bsr    _fc_init
  43.     movem.l    (sp)+,d2-d7/a2-a6
  44.     rts
  45.  
  46. 3$    movem.l    d2-d7/a2-a6,-(sp)
  47.     bsr    _fc_music
  48.     movem.l    (sp)+,d2-d7/a2-a6
  49.     rts
  50.  
  51.         cnop    0,4
  52.     dc.l    gmod_Hook
  53. 9$    gmodnop
  54.     gmodbra    2$            ; StartMusic
  55.     gmodnop
  56.     gmodnop
  57.     gmodnop
  58.     moveq    #1,d0            ; ContinueMusic
  59.     rts
  60.     gmodnop
  61.     gmodnop
  62.     gmodnop
  63.     gmodnop
  64.     gmodnop
  65.     gmodnop
  66.     gmodnop
  67.     gmodnop
  68.     gmodnop
  69.     gmodq    -1            ; GetFrequency
  70.     gmodbra    3$            ; TimerTick
  71.     lea    name(pc),a0        ; GetMakerName
  72.     move.l    a0,d0
  73.     rts
  74.  
  75.  
  76. *********************************************************
  77. **  Amiga FUTURE COMPOSER  »» V1.4 ««  Replay routine  **
  78. *********************************************************
  79.  
  80. ;Doesn't work with V1.0 - V1.3 modules !!
  81.  
  82. _fc_init:
  83.     move.w #1,onoff
  84.     lea 180(a0),a1
  85.     move.l a1,SEQpoint
  86.     move.l a0,a1
  87.     add.l 8(a0),a1
  88.     move.l a1,PATpoint
  89.     move.l a0,a1
  90.     add.l 16(a0),a1
  91.     move.l a1,FRQpoint
  92.     move.l a0,a1
  93.     add.l 24(a0),a1
  94.     move.l a1,VOLpoint
  95.     move.l 4(a0),d0
  96.     divu #13,d0
  97.  
  98.     lea 40(a0),a1
  99.     lea SOUNDINFO+4(pc),a2
  100.     moveq #10-1,d1
  101.     initloop:
  102.     move.w (a1)+,(a2)+
  103.     move.l (a1)+,(a2)+
  104.     adda.w #10,a2
  105.     dbf d1,initloop
  106.     move.l a0,d1
  107.     add.l 32(a0),d1
  108.     lea SOUNDINFO(pc),a3
  109.     move.l d1,(a3)+
  110.     moveq #9-1,d3
  111.     moveq #0,d2
  112.     initloop1:
  113.     move.w (a3),d2
  114.     add.l d2,d1
  115.     add.l d2,d1
  116.     addq.l #2,d1
  117.     adda.w #12,a3
  118.     move.l d1,(a3)+
  119.     dbf d3,initloop1
  120.  
  121.     lea 100(a0),a1
  122.     lea SOUNDINFO+(10*16)(pc),a2
  123.     move.l a0,a3
  124.     add.l 36(a0),a3
  125.  
  126.     moveq #80-1,d1
  127.     moveq #0,d2
  128.     initloop2:
  129.     move.l a3,(a2)+
  130.     move.b (a1)+,d2
  131.     move.w d2,(a2)+
  132.     clr.w (a2)+
  133.     move.w d2,(a2)+
  134.     addq.w #6,a2
  135.     add.w d2,a3
  136.     add.w d2,a3
  137.     dbf d1,initloop2
  138.  
  139.     move.l SEQpoint(pc),a0
  140.     moveq #0,d2
  141.     move.b 12(a0),d2        ;Get replay speed
  142.     bne.s speedok
  143.     move.b #3,d2            ;Set default speed
  144.     speedok:
  145.     move.w d2,respcnt        ;Init repspeed counter
  146.     move.w d2,repspd
  147. INIT2:
  148.     clr.w audtemp
  149.     move.w #$000f,$dff096        ;Disable audio DMA
  150.     move.w #$0780,$dff09a        ;Disable audio IRQ
  151.     moveq #0,d7
  152.     mulu #13,d0
  153.     moveq #4-1,d6            ;Number of soundchannels-1
  154.     lea V1data(pc),a0        ;Point to 1st voice data area
  155.     lea silent(pc),a1
  156.     lea Chandata(pc),a2
  157. initloop3:
  158.     move.l a1,10(a0)
  159.     move.l a1,18(a0)
  160.     clr.w 4(a0)
  161.     move.w #$000d,6(a0)
  162.     clr.w 8(a0)
  163.     clr.l 14(a0)
  164.     move.b #$01,23(a0)
  165.     move.b #$01,24(a0)
  166.     clr.b 25(a0)
  167.     clr.l 26(a0)
  168.     clr.w 30(a0)
  169.     clr.l 38(a0)
  170.     clr.w 42(a0)
  171.     clr.l 44(a0)
  172.     clr.l 48(a0)
  173.     clr.w 56(a0)
  174.     moveq #$00,d3
  175.     move.w (a2)+,d1
  176.     move.w (a2),d3
  177.     divu #$0003,d3
  178.     moveq #0,d4
  179.     bset d3,d4
  180.     move.w d4,32(a0)
  181.     move.w (a2)+,d3
  182.     andi.l #$00ff,d3
  183.     andi.l #$00ff,d1
  184.     lea $dff0a0,a6
  185.     add.w d1,a6
  186.     move.l #$0000,(a6)
  187.     move.w #$0100,4(a6)
  188.     move.w #$0000,6(a6)
  189.     move.w #$0000,8(a6)
  190.     move.l a6,60(a0)
  191.     move.l SEQpoint(pc),(a0)
  192.     move.l SEQpoint(pc),52(a0)
  193.     add.l d0,52(a0)
  194.     add.l d3,52(a0)
  195.     add.l d7,(a0)
  196.     add.l d3,(a0)
  197.     move.l (a0),a3
  198.     move.b (a3),d1
  199.     andi.l #$00ff,d1
  200.     lsl.w #6,d1
  201.     move.l PATpoint(pc),a4
  202.     adda.w d1,a4
  203.     move.l a4,34(a0)
  204.     move.b 1(a3),44(a0)
  205.     move.b 2(a3),22(a0)
  206.     lea $4a(a0),a0        ;Point to next voice's data area
  207.     dbf d6,initloop3
  208.     moveq.l    #0,d0
  209.     rts
  210.  
  211. _fc_music:
  212.     lea audtemp(pc),a5
  213.     tst.w 8(a5)
  214.     bne.s music_on
  215.     rts
  216.     music_on:
  217.     subq.w #1,4(a5)            ;Decrease replayspeed counter
  218.     bne.s nonewnote
  219.     move.w 6(a5),4(a5)        ;Restore replayspeed counter
  220.     moveq #0,d5
  221.     moveq #6,d6
  222.     lea V1data(pc),a0        ;Point to voice1 data area
  223.     bsr new_note
  224.     lea V2data(pc),a0        ;Point to voice2 data area
  225.     bsr new_note
  226.     lea V3data(pc),a0        ;Point to voice3 data area
  227.     bsr new_note
  228.     lea V4data(pc),a0        ;Point to voice4 data area
  229.     bsr new_note
  230. nonewnote:
  231.     clr.w (a5)
  232.     lea $dff000,a6
  233.     lea V1data(pc),a0
  234.     bsr effects
  235.     move.l d0,$a6(a6)
  236.     lea V2data(pc),a0
  237.     bsr effects
  238.     move.l d0,$b6(a6)
  239.     lea V3data(pc),a0
  240.     bsr effects
  241.     move.l d0,$c6(a6)
  242.     lea V4data(pc),a0
  243.     bsr effects
  244.     move.l d0,$d6(a6)
  245.     lea V1data(pc),a0
  246.     move.l 68+(0*74)(a0),a1        ;Get samplepointer
  247.     adda.w 64+(0*74)(a0),a1        ;add repeat_start
  248.     move.l 68+(1*74)(a0),a2
  249.     adda.w 64+(1*74)(a0),a2
  250.     move.l 68+(2*74)(a0),a3
  251.     adda.w 64+(2*74)(a0),a3
  252.     move.l 68+(3*74)(a0),a4
  253.     adda.w 64+(3*74)(a0),a4
  254.     move.w 66+(0*74)(a0),d1        ;Get repeat_length
  255.     move.w 66+(1*74)(a0),d2
  256.     move.w 66+(2*74)(a0),d3
  257.     move.w 66+(3*74)(a0),d4
  258.     moveq #2,d0
  259.     moveq #0,d5
  260.  
  261.         jsr     dmawait
  262.  
  263.     move.w (a5),d7
  264.     ori.w #$8000,d7            ;Set/clr bit = 1
  265.     move.w d7,$dff096        ;Enable audio DMA
  266.  
  267.         jsr     dmawait
  268. chan1:
  269.     lea V1data+72(pc),a0
  270.     move.w (a0),d7
  271.     beq.s chan2
  272.     subq.w #1,(a0)
  273.     cmp.w d0,d7
  274.     bne.s chan2
  275.     move.w d5,(a0)
  276.     move.l a1,$a0(a6)        ;Set samplestart
  277.     move.w d1,$a4(a6)        ;Set samplelength
  278. chan2:
  279.     lea V2data+72(pc),a0
  280.     move.w (a0),d7
  281.     beq.s chan3
  282.     subq.w #1,(a0)
  283.     cmp.w d0,d7
  284.     bne.s chan3
  285.     move.w d5,(a0)
  286.     move.l a2,$b0(a6)
  287.     move.w d2,$b4(a6)
  288. chan3:
  289.     lea V3data+72(pc),a0
  290.     move.w (a0),d7
  291.     beq.s chan4
  292.     subq.w #1,(a0)
  293.     cmp.w d0,d7
  294.     bne.s chan4
  295.     move.w d5,(a0)
  296.     move.l a3,$c0(a6)
  297.     move.w d3,$c4(a6)
  298. chan4:
  299.     lea V4data+72(pc),a0
  300.     move.w (a0),d7
  301.     beq.s endplay
  302.     subq.w #1,(a0)
  303.     cmp.w d0,d7
  304.     bne.s endplay
  305.     move.w d5,(a0)
  306.     move.l a4,$d0(a6)
  307.     move.w d4,$d4(a6)
  308. endplay:
  309.     rts
  310.  
  311. new_note:
  312.     move.l 34(a0),a1
  313.     adda.w 40(a0),a1
  314.     cmp.b #$49,(a1)        ;Check "END" mark in pattern
  315.     beq.s patend
  316.     cmp.w #64,40(a0)        ;Have all the notes been played?
  317.     bne samepat
  318.     patend:
  319.     move.w d5,40(a0)
  320.     move.l (a0),a2
  321.     adda.w 6(a0),a2        ;Point to next sequence row
  322.     cmpa.l 52(a0),a2    ;Is it the end?
  323.     bne.s notend
  324.     move.w d5,6(a0)        ;yes!
  325.     move.l (a0),a2        ;Point to first sequence
  326. notend:
  327.     lea spdtemp(pc),a3
  328.     moveq #1,d1
  329.     addq.b #1,(a3)
  330.     cmpi.b #5,(a3)
  331.     bne.s nonewspd
  332.     move.b d1,(a3)
  333.     move.b 12(a2),d1    ;Get new replay speed
  334.     beq.s nonewspd
  335.     move.w d1,2(a3)        ;store in counter
  336.     move.w d1,4(a3)
  337. nonewspd:
  338.     move.b (a2)+,d1        ;Pattern to play
  339.     move.b (a2)+,44(a0)    ;Transpose value
  340.     move.b (a2)+,22(a0)    ;Soundtranspose value
  341.     lsl.w d6,d1
  342.     move.l PATpoint(pc),a1    ;Get pattern pointer
  343.     add.w d1,a1
  344.     move.l a1,34(a0)
  345.     addi.w #$000d,6(a0)
  346. samepat:
  347.     move.b 1(a1),d1        ;Get info byte
  348.     move.b (a1)+,d0        ;Get note
  349.     bne.s ww1
  350.     andi.w #%11000000,d1
  351.     beq.s noport
  352.     bra.s ww11
  353. ww1:
  354.     move.w d5,56(a0)
  355. ww11:
  356.     move.b d5,47(a0)
  357.     btst #7,d1
  358.     beq.s noport
  359.     move.b 2(a1),47(a0)
  360. noport:
  361.     andi.w #$007f,d0
  362.     beq nextnote
  363.     move.b d0,8(a0)
  364.     move.b (a1),d1
  365.     move.b d1,9(a0)
  366.     move.w 32(a0),d3
  367.     or.w d3,(a5)
  368.     move.w d3,$dff096
  369.     andi.w #$003f,d1    ;Max 64 instruments
  370.     add.b 22(a0),d1        ;add Soundtranspose
  371.     move.l VOLpoint(pc),a2
  372.     lsl.w d6,d1
  373.     adda.w d1,a2
  374.     move.w d5,16(a0)
  375.     move.b (a2),23(a0)
  376.     move.b (a2)+,24(a0)
  377.     moveq #0,d1
  378.     move.b (a2)+,d1
  379.     move.b (a2)+,27(a0)
  380.     move.b #$40,46(a0)
  381.     move.b (a2),28(a0)
  382.     move.b (a2)+,29(a0)
  383.     move.b (a2)+,30(a0)
  384.     move.l a2,10(a0)
  385.     move.l FRQpoint(pc),a2
  386.     lsl.w d6,d1
  387.     adda.w d1,a2
  388.     move.l a2,18(a0)
  389.     move.w d5,50(a0)
  390.     move.b d5,25(a0)
  391.     move.b d5,26(a0)
  392.     nextnote:
  393.     addq.w #2,40(a0)
  394.     rts
  395.  
  396. effects:
  397.     moveq #0,d7
  398.     testsustain:
  399.     tst.b 26(a0)        ;Is sustain counter = 0
  400.     beq.s sustzero
  401.     subq.b #1,26(a0)    ;if no, decrease counter
  402.     bra VOLUfx
  403. sustzero:        ;Next part of effect sequence
  404.     move.l 18(a0),a1    ;can be executed now.
  405.     adda.w 50(a0),a1
  406. testeffects:
  407.     cmpi.b #$e1,(a1)    ;E1 = end of FREQseq sequence
  408.     beq VOLUfx
  409.     move.b (a1),d0
  410.     cmpi.b #$e0,d0        ;E0 = loop to other part of sequence
  411.     bne.s testnewsound
  412.     move.b 1(a1),d1        ;loop to start of sequence + 1(a1)
  413.     andi.w #$003f,d1
  414.     move.w d1,50(a0)
  415.     move.l 18(a0),a1
  416.     adda.w d1,a1
  417.     move.b (a1),d0
  418. testnewsound:
  419.     cmpi.b #$e2,d0        ;E2 = set waveform
  420.     bne.s testE4
  421.     move.w 32(a0),d1
  422.     or.w d1,(a5)
  423.     move.w d1,$dff096
  424.     moveq #0,d0
  425.     move.b 1(a1),d0
  426.     lea SOUNDINFO(pc),a4
  427.     lsl.w #4,d0
  428.     adda.w d0,a4
  429.     move.l 60(a0),a3
  430.     move.l (a4)+,d1
  431.     move.l d1,(a3)
  432.     move.l d1,68(a0)
  433.     move.w (a4)+,4(a3)
  434.     move.l (a4),64(a0)
  435.     move.w #$0003,72(a0)
  436.     move.w d7,16(a0)
  437.     move.b #$01,23(a0)
  438.     addq.w #2,50(a0)
  439.     bra transpose
  440. testE4:
  441.     cmpi.b #$e4,d0
  442.     bne.s testE9
  443.     moveq #0,d0
  444.     move.b 1(a1),d0
  445.     lea SOUNDINFO(pc),a4
  446.     lsl.w #4,d0
  447.     adda.w d0,a4
  448.     move.l 60(a0),a3
  449.     move.l (a4)+,d1
  450.     move.l d1,(a3)
  451.     move.l d1,68(a0)
  452.     move.w (a4)+,4(a3)
  453.     move.l (a4),64(a0)
  454.     move.w #$0003,72(a0)
  455.     addq.w #2,50(a0)
  456.     bra transpose
  457. testE9:
  458.     cmpi.b #$e9,d0
  459.     bne testpatjmp
  460.     move.w 32(a0),d1
  461.     or.w d1,(a5)
  462.     move.w d1,$dff096
  463.     moveq #0,d0
  464.     move.b 1(a1),d0
  465.     lea SOUNDINFO(pc),a4
  466.     lsl.w #4,d0
  467.     adda.w d0,a4
  468.     move.l (a4),a2
  469.     cmpi.l #"SSMP",(a2)+
  470.     bne.s nossmp
  471.     lea 320(a2),a4
  472.     moveq #0,d1
  473.     move.b 2(a1),d1
  474.     lsl.w #4,d1
  475.     add.w d1,a2
  476.     add.l (a2),a4
  477.     move.l 60(a0),a3
  478.     move.l a4,(a3)
  479.     move.l 4(a2),4(a3)
  480.     move.l a4,68(a0)
  481.     move.l 6(a2),64(a0)
  482.     move.w d7,16(a0)
  483.     move.b #1,23(a0)
  484.     move.w #3,72(a0)
  485. nossmp:
  486.     addq.w #3,50(a0)
  487.     bra.s transpose
  488.     testpatjmp:
  489.     cmpi.b #$e7,d0
  490.     bne.s testpitchbend
  491.     moveq #0,d0
  492.     move.b 1(a1),d0
  493.     lsl.w d6,d0
  494.     move.l FRQpoint(pc),a1
  495.     adda.w d0,a1
  496.     move.l a1,18(a0)
  497.     move.w d7,50(a0)
  498.     bra testeffects
  499. testpitchbend:
  500.     cmpi.b #$ea,d0
  501.     bne.s testnewsustain
  502.     move.b 1(a1),4(a0)
  503.     move.b 2(a1),5(a0)
  504.     addq.w #3,50(a0)
  505.     bra.s transpose
  506. testnewsustain:
  507.     cmpi.b #$e8,d0
  508.     bne.s testnewvib
  509.     move.b 1(a1),26(a0)
  510.     addq.w #2,50(a0)
  511.     bra testsustain
  512. testnewvib:
  513.     cmpi.b #$e3,(a1)+
  514.     bne.s transpose
  515.     addq.w #3,50(a0)
  516.     move.b (a1)+,27(a0)
  517.     move.b (a1),28(a0)
  518. transpose:
  519.     move.l 18(a0),a1
  520.     adda.w 50(a0),a1
  521.     move.b (a1),43(a0)
  522.     addq.w #1,50(a0)
  523.  
  524. VOLUfx:
  525.     tst.b 25(a0)
  526.     beq.s volsustzero
  527.     subq.b #1,25(a0)
  528.     bra calcperiod
  529.     volsustzero:
  530.     tst.b 15(a0)
  531.     bne.s do_VOLbend
  532.     subq.b #1,23(a0)
  533.     bne.s calcperiod
  534.     move.b 24(a0),23(a0)
  535. volu_cmd:
  536.     move.l 10(a0),a1
  537.     adda.w 16(a0),a1
  538.     move.b (a1),d0
  539. testvoluend:
  540.     cmpi.b #$e1,d0
  541.     beq.s calcperiod
  542.     cmpi.b #$ea,d0
  543.     bne.s testVOLsustain
  544.     move.b 1(a1),14(a0)
  545.     move.b 2(a1),15(a0)
  546.     addq.w #3,16(a0)
  547.     bra.s do_VOLbend
  548. testVOLsustain:
  549.     cmpi.b #$e8,d0
  550.     bne.s testVOLloop
  551.     addq.w #2,16(a0)
  552.     move.b 1(a1),25(a0)
  553.     bra.s calcperiod
  554. testVOLloop:
  555.     cmpi.b #$e0,d0
  556.     bne.s setvolume
  557.     move.b 1(a1),d0
  558.     andi.w #$003f,d0
  559.     subq.b #5,d0
  560.     move.w d0,16(a0)
  561.     bra.s volu_cmd
  562. do_VOLbend:
  563.     not.b 38(a0)
  564.     beq.s calcperiod
  565.     subq.b #1,15(a0)
  566.     move.b 14(a0),d1
  567.     add.b d1,45(a0)
  568.     bpl.s calcperiod
  569.     moveq #0,d1
  570.     move.b d1,15(a0)
  571.     move.b d1,45(a0)
  572.     bra.s calcperiod
  573. setvolume:
  574.     move.b (a1),45(a0)
  575.     addq.w #1,16(a0)
  576. calcperiod:
  577.     move.b 43(a0),d0
  578.     bmi.s lockednote
  579.     add.b 8(a0),d0
  580.     add.b 44(a0),d0
  581. lockednote:
  582.     moveq #$7f,d1
  583.     and.l d1,d0
  584.     lea PERIODS(pc),a1
  585.     add.w d0,d0
  586.     move.w d0,d1
  587.     adda.w d0,a1
  588.     move.w (a1),d0
  589.  
  590.     move.b 46(a0),d7
  591.     tst.b 30(a0)        ;Vibrato_delay = zero ?
  592.     beq.s vibrator
  593.     subq.b #1,30(a0)
  594.     bra.s novibrato
  595. vibrator:
  596.     moveq #5,d2
  597.     move.b d1,d5
  598.     move.b 28(a0),d4
  599.     add.b d4,d4
  600.     move.b 29(a0),d1
  601.     tst.b d7
  602.     bpl.s vib1
  603.     btst #0,d7
  604.     bne.s vib4
  605. vib1:
  606.     btst d2,d7
  607.     bne.s vib2
  608.     sub.b 27(a0),d1
  609.     bcc.s vib3
  610.     bset d2,d7
  611.     moveq #0,d1
  612.     bra.s vib3
  613. vib2:
  614.     add.b 27(a0),d1
  615.     cmp.b d4,d1
  616.     bcs.s vib3
  617.     bclr d2,d7
  618.     move.b d4,d1
  619. vib3:
  620.     move.b d1,29(a0)
  621. vib4:
  622.     lsr.b #1,d4
  623.     sub.b d4,d1
  624.     bcc.s vib5
  625.     subi.w #$0100,d1
  626. vib5:
  627.     addi.b #$a0,d5
  628.     bcs.s vib7
  629. vib6:
  630.     add.w d1,d1
  631.     addi.b #$18,d5
  632.     bcc.s vib6
  633. vib7:
  634.     add.w d1,d0
  635. novibrato:
  636.     eori.b #$01,d7
  637.     move.b d7,46(a0)
  638.  
  639.     ; DO THE PORTAMENTO THING
  640.     not.b 39(a0)
  641.     beq.s pitchbend
  642.     moveq #0,d1
  643.     move.b 47(a0),d1    ;get portavalue
  644.     beq.s pitchbend        ;0=no portamento
  645.     cmpi.b #$1f,d1
  646.     bls.s portaup
  647. portadown:
  648.     andi.w #$1f,d1
  649.     neg.w d1
  650. portaup:
  651.     sub.w d1,56(a0)
  652. pitchbend:
  653.     not.b 42(a0)
  654.     beq.s addporta
  655.     tst.b 5(a0)
  656.     beq.s addporta
  657.     subq.b #1,5(a0)
  658.     moveq #0,d1
  659.     move.b 4(a0),d1
  660.     bpl.s pitchup
  661.     ext.w d1
  662. pitchup:
  663.     sub.w d1,56(a0)
  664. addporta:
  665.     add.w 56(a0),d0
  666.     cmpi.w #$0070,d0
  667.     bhi.s nn1
  668.     move.w #$0071,d0
  669. nn1:
  670.     cmpi.w #$0d60,d0
  671.     bls.s nn2
  672.     move.w #$0d60,d0
  673. nn2:
  674.     swap d0
  675.     move.b 45(a0),d0
  676.     rts
  677.  
  678.  
  679.  
  680. V1data:  dcb.b 64,0    ;Voice 1 data area
  681. offset1: dcb.b 02,0    ;Is added to start of sound
  682. ssize1:  dcb.b 02,0    ;Length of sound
  683. start1:  dcb.b 06,0    ;Start of sound
  684.  
  685. V2data:  dcb.b 64,0    ;Voice 2 data area
  686. offset2: dcb.b 02,0
  687. ssize2:  dcb.b 02,0
  688. start2:  dcb.b 06,0
  689.  
  690. V3data:  dcb.b 64,0    ;Voice 3 data area
  691. offset3: dcb.b 02,0
  692. ssize3:  dcb.b 02,0
  693. start3:  dcb.b 06,0
  694.  
  695. V4data:  dcb.b 64,0    ;Voice 4 data area
  696. offset4: dcb.b 02,0
  697. ssize4:  dcb.b 02,0
  698. start4:  dcb.b 06,0
  699.  
  700. audtemp: dc.w 0        ;DMACON
  701. spdtemp: dc.w 0
  702. respcnt: dc.w 0        ;Replay speed counter
  703. repspd:  dc.w 0        ;Replay speed counter temp
  704. onoff:   dc.w 0        ;Music on/off flag.
  705.  
  706. Chandata: dc.l $00000000,$00100003,$00200006,$00300009
  707. SEQpoint: dc.l 0
  708. PATpoint: dc.l 0
  709. FRQpoint: dc.l 0
  710. VOLpoint: dc.l 0
  711.  
  712.  
  713. silent: dc.w $0100,$0000,$0000,$00e1
  714.  
  715. PERIODS: dc.w $06b0,$0650,$05f4,$05a0,$054c,$0500,$04b8,$0474
  716.     dc.w $0434,$03f8,$03c0,$038a,$0358,$0328,$02fa,$02d0
  717.     dc.w $02a6,$0280,$025c,$023a,$021a,$01fc,$01e0,$01c5
  718.     dc.w $01ac,$0194,$017d,$0168,$0153,$0140,$012e,$011d
  719.     dc.w $010d,$00fe,$00f0,$00e2,$00d6,$00ca,$00be,$00b4
  720.     dc.w $00aa,$00a0,$0097,$008f,$0087,$007f,$0078,$0071
  721.     dc.w $0071,$0071,$0071,$0071,$0071,$0071,$0071,$0071
  722.     dc.w $0071,$0071,$0071,$0071,$0d60,$0ca0,$0be8,$0b40
  723.     dc.w $0a98,$0a00,$0970,$08e8,$0868,$07f0,$0780,$0714
  724.     dc.w $1ac0,$1940,$17d0,$1680,$1530,$1400,$12e0,$11d0
  725.     dc.w $10d0,$0fe0,$0f00,$0e28,$06b0,$0650,$05f4,$05a0
  726.     dc.w $054c,$0500,$04b8,$0474,$0434,$03f8,$03c0,$038a
  727.     dc.w $0358,$0328,$02fa,$02d0,$02a6,$0280,$025c,$023a
  728.     dc.w $021a,$01fc,$01e0,$01c5,$01ac,$0194,$017d,$0168
  729.     dc.w $0153,$0140,$012e,$011d,$010d,$00fe,$00f0,$00e2
  730.     dc.w $00d6,$00ca,$00be,$00b4,$00aa,$00a0,$0097,$008f
  731.     dc.w $0087,$007f,$0078,$0071
  732.  
  733. SOUNDINFO:
  734. ;Start.l , Length.w , Repeat start.w , Repeat-length.w , dcb.b 6,0
  735.  
  736.     dcb.b 10*16,0    ;Reserved for samples
  737.     dcb.b 80*16,0    ;Reserved for waveforms
  738.  
  739. name    dc.b    "Future Composer 1.4",0
  740.  
  741.     end
  742.